//观察者模式定义对象间的一种一对多的依赖关系，当一个对象的状态发生变化时，所有依赖于它的对象都得到通道并被自动更新
#include <vector>
class Subject;
class Observer
{
public:
	virtual void update(Subject* obj, int value) = 0;
};


class Subject {
	int m_value;
    std::vector<Observer*> m_views;
public:
    void attach(Observer * obs)
    {
        m_views.push_back(obs);
    }
    
    void set_value(int value)
    {
        m_value = value;
        notify();
    }
    
    void notify()
    {
        for(int i = 0; i < m_views.size(); ++i)
        {
            m_views[i]->update(this, m_value);
        }
    }
};

//这是一种经典的观察者模式的实现，但这种实现不够通用，只能对特定的观察者有效，即必须是observer抽象类的派生类才行，并且这个观察者类还不能带参数，虽然能在抽象类中定义带几个指定参数的观察者方法，但不够通用。
//因为，在实际情况下参数个数是不定的。这样的实现，最主要的两个限定：1. 需要继承，继承是强对象关系，不够灵活。2. 观察者被通知的接口参数不支持变化，导致观察者不能应付接口的变化
